package com.zuihai.app.app;

import android.app.Application;
import android.content.Context;

import com.jess.arms.base.delegate.AppDelegate;
import com.jess.arms.di.module.GlobeConfigModule;
import com.jess.arms.integration.ConfigModule;
import com.jess.arms.integration.IRepositoryManager;
import com.zuihai.app.BuildConfig;
import com.zuihai.app.mvp.model.api.Shuoshuo.IInquireShuoshuo;
import com.zuihai.app.mvp.model.api.cache.CommonCache;
import com.zuihai.app.mvp.model.api.my.IMy;
import com.zuihai.app.mvp.model.api.service.CommonService;
import com.zuihai.app.mvp.model.api.service.DetailService;
import com.zuihai.app.mvp.model.api.service.FindService;
import com.zuihai.app.mvp.model.api.service.HomeService;
import com.zuihai.app.mvp.model.api.service.MainService;
import com.zuihai.app.mvp.model.api.service.ReleaseService;
import com.zuihai.app.mvp.model.api.service.SearchService;
import com.zuihai.app.mvp.model.api.service.UserService;


import java.util.List;

import timber.log.Timber;

/**
 * app的全局配置信息在此配置,需要将此实现类声明到AndroidManifest中
 * Created by jess on 12/04/2017 17:25
 * Contact with jess.yan.effort@gmail.com
 */


public class GlobalConfiguration implements ConfigModule {
    @Override
    public void applyOptions(Context context, GlobeConfigModule.Builder builder) {
//        builder.baseurl(Api.APP_DOMAIN)
//                .globeHttpHandler(new GlobeHttpHandler() {// 这里可以提供一个全局处理Http请求和响应结果的处理类,
//                    // 这里可以比客户端提前一步拿到服务器返回的结果,可以做一些操作,比如token超时,重新获取
//                    @Override
//                    public Response onHttpResultResponse(String httpResult, Interceptor.Chain chain, Response response) {
//                        /* 这里可以先客户端一步拿到每一次http请求的结果,可以解析成json,做一些操作,如检测到token过期后
//                           重新请求token,并重新执行请求 */
//                        LogUtils.e(httpResult);
//
//                     /* 这里如果发现token过期,可以先请求最新的token,然后在拿新的token放入request里去重新请求
//                        注意在这个回调之前已经调用过proceed,所以这里必须自己去建立网络请求,如使用okhttp使用新的request去请求
//                        create a new request and modify it accordingly using the new token
//                        Request newRequest = chain.request().newBuilder().header("token", newToken)
//                                             .build();
//
//                        retry the request
//
//                        response.body().close();
//                        如果使用okhttp将新的请求,请求成功后,将返回的response  return出去即可
//                        如果不需要返回新的结果,则直接把response参数返回出去 */
//
//                        return response;
//                    }
//
//                    // 这里可以在请求服务器之前可以拿到request,做一些操作比如给request统一添加token或者header以及参数加密等操作
//                    @Override
//                    public Request onHttpRequestBefore(Interceptor.Chain chain, Request request) {
//                        /* 如果需要再请求服务器之前做一些操作,则重新返回一个做过操作的的requeat如增加header,不做操作则直接返回request参数
//                           return chain.request().newBuilder().header("token", tokenId)
//                                  .build(); */
//                        return request;
//                    }
//                })
//                .responseErroListener((context1, e) -> {
//                    /* 用来提供处理所有错误的监听
//                       rxjava必要要使用ErrorHandleSubscriber(默认实现Subscriber的onError方法),此监听才生效 */
//                    LogUtils.e(e.getMessage());
//                      MyToastPK.showError("服务器错误，请稍后再试");
//                });
    }

    @Override
    public void registerComponents(Context context, IRepositoryManager repositoryManager) {
        repositoryManager.injectRetrofitService(CommonService.class
                , UserService.class, DetailService.class
                , HomeService.class, FindService.class
                , IInquireShuoshuo.class, IMy.class
                , ReleaseService.class, SearchService.class
                , MainService.class);
        repositoryManager.injectCacheService(CommonCache.class);
    }

    @Override
    public void injectAppLifecycle(Context context, List<AppDelegate.Lifecycle> lifecycles) {
        // AppDelegate.Lifecycle 的所有方法都会在BaseApplication对应的生命周期中被调用,所以在对应的方法中可以扩展一些自己需要的逻辑
        lifecycles.add(new AppDelegate.Lifecycle() {

            @Override
            public void onCreate(Application application) {
                if (BuildConfig.LOG_DEBUG) {//Timber日志打印
                    Timber.plant(new Timber.DebugTree());
                }
                //leakCanary内存泄露检查
//                this.mRefWatcher = BuildConfig.USE_CANARY ? LeakCanary.install(application) : RefWatcher.DISABLED;
            }

            @Override
            public void onTerminate(Application application) {
//                this.mRefWatcher = null;
            }
        });
    }

}
